)}
{/* Sections */}
{chapter.sections.map((section, idx) => (
{/* Never render the first section heading — it sits flush under the chapter title
and reads as a subtitle. Chapter context is already set by the chapter title. */}
{section.heading && idx > 0 && (
All rights reserved. No part of this publication may be reproduced, distributed, or transmitted in any form or by any means — including photocopying, recording, or other electronic or mechanical methods — without the prior written permission of the author.
Scripture quotations are taken from various Bible translations as noted in the text.
{/* Column track — CSS multi-column, one column = one page */}
{/* position:absolute breaks it free of containerW width constraint */}
{/* overflow:hidden on the column track keeps extra empty cols clipped */}
{/* translateX jumps INSTANTLY (no transition) — body never moves */}
{/* Fade on opacity gives the clean Kindle page-cut feel */}
0 ? `${columnWidth * 400}px` : "100%",
height: containerH > 0 ? `${containerH}px` : "100%",
// CSS multi-column: each column = columnWidth × containerH = one page
// In landscape, columnWidth = containerW/2 → two columns fill the viewport
columnWidth: columnWidth > 0 ? `${columnWidth}px` : "auto",
columnGap: 0,
columnFill: "auto",
overflow: "hidden",
// Instant jump — no slide, body stays completely still
transform: `translateX(${translateX}px)`,
// Crossfade: fade out on flip start, fade in on flip end
opacity: isFlipping ? 0 : 1,
transition: isFlipping
? "opacity 0.14s ease-out"
: "opacity 0.22s ease-in",
willChange: "opacity",
}}
>
{/* Padding wrapper with box-decoration-break:clone so EVERY page */}
{/* fragment (column) gets its own top/bottom/left/right padding */}
{/* Right-edge shadow — subtle visual page boundary */}
{/* Two-page book gutter — landscape only */}
{isLandscape && (
<>
{/* Soft inner shadow on both sides of the spine */}
{/* Hard 1px center line */}
>
)}
{/* ── Audio reader bar (sits between viewport and footer in flex column) ── */}
{audioOpen && currentAudioChapter && (
setAudioOpen(false)}
/>
)}
{/* ── Bottom chrome ── */}
{/* ── Selection popup ── */}
{annotationMode && selection && (
<>
{/* Full-screen backdrop: pointer down anywhere outside the popup cancels it */}